// 命令模式.
// 实现 add  sub mul div.

/**
 * 
 * class Calculator {
    constructor(){
        this.current = 0;
    }
    add(value){
        this.current += value;
    }
    sub(value){
        this.current -= value;
    }
    mul(value){
        this.current *= value;
    }
    div(value){
        this.current /= value;
    }
    getCurrent(){
        return this.current;
    }
}

const client = new Calculator();
client.add(5);
client.sub(3);
client.mul(3);
client.div(3);

 */

 // 此时操作 紧耦合了,
 // 也就是 行为请求者 和 行为实现者 紧耦合了.
 
 //將『行為請求者』與『行為實現者』的解耦合，也就是所謂的『命令模式』
 

 // 此时在 行为请求者 =>  行为实现者  增加一个 呼叫者 即: 行为请求者 =>(Invoker) => 行为实现者
 // 实现了解耦.

 class MyInvoker{
    constructor(){
        this.commands =[];
        this.current = 0;
    }   

    execute(command){
        this.commands.push(command);
        this.current= command.execute(this.current);
        console.log(`Execute command: ${command.name},and result : ${this.current}`);
    }

    undo(){
        const command = this.commands.pop();
        this.current = command.undo(this.current);
        console.log(`Execute undo and result :${this.current}`);
       
    }

    getCurrent(){
        return this.current;
    }
 }

 // 每个命令 创建一个对象.
 class AddCommand{
     constructor(value){
         this.value = value;
         this.name = "Add";
     }
     execute(current){
         return current + this.value;
     }
     undo (current){
         return current - this.value;
     }
 }

 class SubCommand{
    constructor(value){
        this.value = value;
        this.name = "Sub";
    }
    execute(current){
        return current -this.value;
    }
    undo (current){
        return current + this.value;
    }
 }

 // 执行的时候 ,我们会通知 Invoker, 让实际执行者 也就是 SubCommand.execute 执行工作.

 const invoker = new MyInvoker();
invoker.execute(new AddCommand(4));
invoker.execute(new SubCommand(5));

console.log(invoker.getCurrent());

var obj = { name: 'John', age: 22 };
console.log(`my object is: ${JSON.stringify(obj)}`);